package com.demo.config.Segment;

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.BaseAnalysis;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * ansj_seg分词示例
 */
public class AnsjSegUtil {

	/**
	 * 基本分词-最基本的分词 基本就是保证了最基本的分词.词语颗粒度最非常小的..所涉及到的词大约是10万左右.
	 * 基本分词速度非常快.在macAir上.能到每秒300w字每秒.同时准确率也很高.但是对于新词他的功能十分有限
	 * @param content
	 */
	public static void baseAnay(String content) {
		Result result = BaseAnalysis.parse(delHTMLTag(content).replace("\n", "").replace(" ", "").replace("\t", ""));
		System.out.println("result:" + result);
	}

	/**
	 * 精准分词 它在易用性,稳定性.准确性.以及分词效率上.都取得了一个不错的平衡.
	 * @param content
	 */
	public static void toAnay(String content) {
		Result result = ToAnalysis.parse(content);
		System.out.println("result:" + result);
	}

	/**
	 * 获取地名 nlp分词(单条新闻处理7秒)--推荐使用这个
	 * 可以识别出未登录词.但是它也有它的缺点.速度比较慢.稳定性差.ps:我这里说的慢仅仅是和自己的其他方式比较.应该是40w字每秒的速度吧.
	 * 个人觉得nlp的适用方式.1.语法实体名抽取.未登录词整理.只要是对文本进行发现分析等工作 会把企业分开
	 * @param content
	 */
	public static String getNlpAnayNs(String content) {
		Result result = NlpAnalysis.parse(delHTMLTag(content).replace("\n", "").replace(" ", "").replace("\t", ""));
		List<Term> terms = result.getTerms();
		StringBuilder resTxt = new StringBuilder();
		for (Term term : terms) {
			String nature = term.getNatureStr();
			// 区分地名还是人名
			if (nature.equals("ns")) {
				resTxt.append(",").append(term.getName());
			}
		}
		return resTxt.toString();
	}

	/**
	 * 获取人名 nlp分词(单条新闻处理7秒)--推荐使用这个
	 * 可以识别出未登录词.但是它也有它的缺点.速度比较慢.稳定性差.ps:我这里说的慢仅仅是和自己的其他方式比较.应该是40w字每秒的速度吧.
	 * 个人觉得nlp的适用方式.1.语法实体名抽取.未登录词整理.只要是对文本进行发现分析等工作 会把企业分开
	 * @param content
	 */
	public static String getNlpAnayNr(String content) {
		Result result = NlpAnalysis.parse(delHTMLTag(content).replace("\n", "").replace(" ", "").replace("\t", ""));
		List<Term> terms = result.getTerms();
		StringBuilder resTxt = new StringBuilder();
		for (Term term : terms) {
			String nature = term.getNatureStr();
			// 区分地名还是人名
			if (nature.equals("nr")) {
				resTxt.append(",").append(term.getName());
			}
		}
		return resTxt.toString();
	}

	/**
	 * 筛除HTML标签
	 * @param htmlStr
	 * @return
	 */
	public static String delHTMLTag(String htmlStr) {
		String regEx_script = "<script[^>]*?>[\\s\\S]*?<\\/script>"; // 定义script的正则表达式
		String regEx_style = "<style[^>]*?>[\\s\\S]*?<\\/style>"; // 定义style的正则表达式
		String regEx_html = "<[^>]+>"; // 定义HTML标签的正则表达式

		Pattern p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
		Matcher m_script = p_script.matcher(htmlStr);
		htmlStr = m_script.replaceAll(""); // 过滤script标签

		Pattern p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
		Matcher m_style = p_style.matcher(htmlStr);
		htmlStr = m_style.replaceAll(""); // 过滤style标签

		Pattern p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
		Matcher m_html = p_html.matcher(htmlStr);
		htmlStr = m_html.replaceAll(""); // 过滤html标签

		return htmlStr.trim(); // 返回文本字符串
	}

}
